﻿// 180. 排书  jinjiezhinan.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

/*

https://www.acwing.com/problem/content/182/
给定 n 本书，编号为 1∼n。

在初始状态下，书是任意排列的。

在每一次操作中，可以抽取其中连续的一段，再把这段插入到其他某个位置。

我们的目标状态是把书按照 1∼n 的顺序依次排列。

求最少需要多少次操作。

输入格式
第一行包含整数 T，表示共有 T 组测试数据。

每组数据包含两行，第一行为整数 n，表示书的数量。

第二行为 n 个整数，表示 1∼n 的一种任意排列。

同行数之间用空格隔开。

输出格式
每组数据输出一个最少操作次数。

如果最少操作次数大于或等于 5 次，则输出 5 or more。

每个结果占一行。

数据范围
1≤n≤15
输入样例：
3
6
1 3 4 6 2 5
5
5 4 3 2 1
10
6 8 5 3 4 7 2 9 1 10
输出样例：
2
3
5 or more
*/


#include <iostream>
#include <cstring>
#include <algorithm>

using  namespace std;


const int N = 15;
int n;
int q[N];
int w[5][N];
int f() {
	int tot = 0;
	for (int i = 0; i + 1 < n; i++) {
		if (q[i + 1] != q[i] + 1) {
			tot++;
		}
	}

	return (tot + 2) / 3;
}

bool dfs(int depth, int max_depth) {
	if (depth + f() > max_depth) return false;
	if (f() == 0) return true;

	for (int len = 1; len <= n; len++) {
		for (int l = 0; l + len - 1 < n; l++) {
			int r = l + len - 1;
			for (int k = r + 1; k < n; k++) {
				memcpy(w[depth], q, sizeof  q);
				int y = l;
				for (int x = r + 1; x <= k; x++, y++) q[y] = w[depth][x];
				for (int x = l; x <= r; x++, y++) q[y] = w[depth][x];
				if (dfs(depth + 1, max_depth))  return true;
				memcpy(q, w[depth], sizeof q);
			}
		}
	}

	return false;
}

int main()
{
	int T;
	cin >> T;
	while (T--) {
		cin >> n;
		for (int i = 0; i < n; i++) cin >> q[i];
		int depth = 0;
		while (depth < 5 && !dfs(0, depth)) depth++;
		if (depth >= 5) puts("5 or more");
		else cout << depth << endl;
	}

	return 0;
}

